package utils

import (
	"github.com/Sir-yuChen/funAnalyse/global"
	"io/ioutil"
	"os"
	"path"
	"runtime"
	"strings"
	"text/template"
)

// AutoCodeStruct 初始版本自动化代码工具
type AutoCodeStruct struct {
	AutoCodePattern string       `json:"autoCodePattern"` // 生成模式 根据不同的生成模式 不同分组的模板信息
	PkgName         string       `json:"pkgName"`         // 代码包
	TableName       string       `json:"tableName"`       // 表名
	HasTimer        bool         `json:"hasTimer"`        //是否存在时间类型
	RouterGroup     string       `json:"routerGroup"`     //路由分组 方法父路由
	AutoCodeName    string       `json:"autoCodeName"`    //生成的文件名
	Fields          []*DBColumns `json:"fields,omitempty"`
}

type TplData struct {
	Template      *template.Template `json:"template,omitempty"`      //操作模板
	PresetTplPath string             `json:"presetTplPath,omitempty"` //预设的模板路径
	PresetTplName string             `json:"presetTplName,omitempty"` //预设的模板名
	AutoPackage   string             `json:"autoPackage,omitempty"`   //生成的代码包名
	AutoCodePath  string             `json:"autoCodePath,omitempty"`  //生成的代码文件的路径
}
type TableName struct {
	TableName string `json:"tableName" gorm:"column:table_name"`
}

// GetAllTplFile 文件夹下所有 tpl 模板文件
func GetAllTplFile(path string, fileList []string) ([]string, error) {
	files, err := ioutil.ReadDir(path)
	for _, fi := range files {
		if fi.IsDir() {
			//是文件夹 递归调用
			fileList, err = GetAllTplFile(path+"/"+fi.Name(), fileList)
			if err != nil {
				return nil, err
			}
		} else {
			if strings.HasSuffix(fi.Name(), ".tpl") {
				fileList = append(fileList, path+"/"+fi.Name())
			}
		}
	}
	return fileList, err
}

// GetAbsPath 获取项目路径
func GetAbsPath() string {
	var abPath string
	_, filename, _, ok := runtime.Caller(1)
	if ok {
		abPath = path.Dir(filename)
		split := strings.Split(abPath, global.GVA_CONFIG.System.ApplicationName)
		split[0] += global.GVA_CONFIG.System.ApplicationName
		abPath = split[0]
	}
	return abPath
}

// FileExist 判断文件/文件夹是否存在
func FileExist(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return true, err
}

// FirstCharUpper 字符串 大写开头 驼峰
func FirstCharUpper(str string) string {
	b := strings.Contains(str, "_")
	upperStr := ""
	if b {
		split := strings.Split(str, "_")
		newStr := make([]string, len(split))
		for _, s := range split {
			newStr = append(newStr, strings.ToUpper(s[0:1])+s[1:])
		}
		for _, s := range newStr {
			if s != "" {
				upperStr += s
			}
		}
	} else {
		upperStr = strings.ToUpper(str[0:1]) + str[1:]
	}
	return upperStr
}

// FirstCharLower  字符串 小写开头 驼峰
func FirstCharLower(str string) string {
	b := strings.Contains(str, "_")
	lowerStr := ""
	if b {
		split := strings.Split(str, "_")
		newStr := make([]string, len(split))
		for i, s := range split {
			if i == 0 {
				newStr = append(newStr, strings.ToLower(s[0:1])+s[1:])
			} else {
				newStr = append(newStr, strings.ToUpper(s[0:1])+s[1:])
			}
		}
		for _, s := range newStr {
			if s != "" {
				lowerStr += s
			}
		}
	} else {
		lowerStr = strings.ToLower(str[0:1]) + str[1:]
	}
	return lowerStr
}
